今天已經來到第十天啦!! 沒想到我可以撐到現在QQ
那麼今天就要來做Client端啦!!
首先我們要使用gRPC_Client,如果忘記可以回頭去看這裡,接著一樣將原本的入口刪掉,設置一個新的資料夾Client,之後我們其他的Client都會建在這個資料夾底下,並新增一個新的class,取名叫Client01。
首先先設計連線通道
//設計好連線資訊
String host = "localhost";
int port = 5000;
//通訊管道建立
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host,port).usePlaintext().build();
調用ManagedChannelBuilder中的forAddress輸入指定的IP跟port號,調用usePlaintext()表示要使用文本傳遞,最後調用build()建立連線。
我們可以透過判斷該連線是否存在判定我們通道是否有建立起來,所以可以這樣寫:
if (managedChannel != null && !managedChannel.isShutdown())
System.out.println(" channel build success !! " + host + ":" + port);
可以嘗試著執行程式讓他連線看看,要先記得開啟server端,如果能夠成功印出連線內容,那就表示可以連線成功。
然後我們要開始設計Client內部了,首先先調用IronManServiceGrpc中的newBlockingStub(),這是一個同步的傳遞方式,有人可能會問,有同步那是不是就會有非同步,這個等之後會一併說明,我們先繼續往下操作:
//透過通道連線
IronManServiceGrpc.IronManServiceBlockingStub ironManServiceFutureStub = IronManServiceGrpc.newBlockingStub(managedChannel);
//調用gRPC完成
//準備request參數
IronManProto.IronManRequest01.Builder builder = IronManProto.IronManRequest01.newBuilder();
builder.setName("IronMan");
builder.setAge(String.valueOf(28));
IronManProto.IronManRequest01 ironManRequest01 = builder.build();
//傳遞資料並準備接收server端回傳的response
IronManProto.IronManResponse01 ironManResponse01 = ironManServiceFutureStub.ironMan01(ironManRequest01);
String result = ironManResponse01.getResult();
System.out.println("我是response: " + result);
//關閉連線
managedChannel.shutdown();
準備好要傳遞出去的訊息,我們調用IronManProto中的IronManRequest01.newBuilder(),建立新的訊息。
使用set函數將資料設定好,最後再把資料包裹進Request中,到這裡,我們就準備好傳送資料了。
我們在server收到資料後還會回傳一個response,所以我們要接收response,調用ironManServiceFutureStub.ironMan01,也就是我們當初設定好的server端接口中的ironMan01函式,把我們的ironManRequest01丟進去後,server接收到request,server就回傳一個response給Client,最後再將整個連線關閉。這樣我們就完成了一次資料的傳遞跟回傳。
我們來實際傳遞一次資料,看看結果會是什麼樣子
首先先開啟server端,再開啟client端將訊息打過去
先看看server端這邊收到什麼
再看看client端這邊收到了什麼
到此,我們就完成第一次的client-server溝通囉!! 接下來會再帶大家實作其他種類的傳遞方式~